# 作业一、使用 while 和 for…in 两个循环分别输出四种九九乘法表效果（共计 8 个）

'''
for in 循环
'''

# 第一种：
for x in range(1,10):
    for y in range(1,x+1):
        print('{}*{}={:<4}'.format(x,y,x*y),end=' ')
    print(' ')

print('-'*150)

# 第二种：
for x in range(9,0,-1):
    for y in range(x,0,-1):
        print('{}*{}={:<4}'.format(x,y,x*y),end=' ')
    print(' ')

print('-'*150)

# 第三种：
for x in range(1,10):
    for y in range(9,0,-1):
        if x < y:
            print(' '*8,end=' ')
        else:
            print('{}*{}={:<4}'.format(x,y,x*y),end=' ')
    print(' ')

print('-'*150)

# 第四种：
for x in range(9,0,-1):
    for y in range(9,0,-1):
        if x < y:
            print(' '*8,end=' ')
        else:
            print('{}*{}={:<4}'.format(x,y,x*y),end=' ')
    print(' ')

print('-'*150)

'''
while 循环
'''

# 第一种：
x=1
while x<10:
    y=1
    while y<=x:
        print('{}*{}={:<4}'.format(x, y, x * y), end=' ')
        y=y+1
    x=x+1
    print(' ')

print('-'*150)

# 第二种：
x=9
while x>0:
    y=1
    while y<=x:
        print('{}*{}={:<4}'.format(x, y, x * y),end=' ')
        y=y+1
    x=x-1
    print(' ')

print('-'*150)

# 第三种
x=1
while x<10:
    y=9
    while y>=1:
        if x<y:
            print(' ' * 8, end=' ')
        else:
            print('{}*{}={:<4}'.format(x, y, x * y), end=' ')
        y=y-1
    x=x+1
    print(' ')

print('-'*150)

# 第四种：
x=9
while x>=1:
    y=9
    while y>=1:
        if x>=y:
            print('{}*{}={:<4}'.format(x, y, x * y), end=' ')
        else:
            print(' ' * 8, end=' ')
        y=y-1
    x=x-1
    print(' ')

print('-'*150)


print('='*70,'作业二','='*70)
# 使用文件和目录操作，定义一个统计指定目录大小的函数（注意目录中还有子目录）

import os
# 定义统计目录大小函数
def dirsize(dir):
    sum=0
    if os.path.isfile(dir):   # 判断目录是文件或是文件夹
        sum+=os.path.getsize(dir)
    if os.path.isdir(dir):
        ldir=os.listdir(dir)
        for i in ldir:
            file=os.path.join(dir,i)
            if os.path.isdir(file):
                sum+=dirsize(file)    #  递归调用统计
            if os.path.isfile(file):
                sum+=os.path.getsize(file)
    return sum
print(dirsize('/Users/zhangliu/Desktop/文件夹'))


print('='*70,'作业三','='*70)
# 参考第 9 节的综合案例中的学生信息管理，来实现一个自动取款机的存取款模拟效果。要求有登陆和退出、查询余额、取钱，存钱等操作

users_data = [
    {'user':'zhangsan', 'pw':'zhangsan', 'money':1000},
    {'user':'lisi', 'pw':'lisi', 'money':0},
    {'user':'wangwu', 'pw':'wangwu', 'money':300},
    {'user':'zhaoliu', 'pw':'zhaoliu', 'money':500}
]
# 定义一个空列表的目的是让atm记住当前登陆的用户信息
user_list = []

# 交互界面
def show_face():
    '''
    给用户展示的交互界面
    :return:
    '''
    print('=' * 33, 'ATM操作界面', '=' * 33)
    print('|{:^36}|{:^36}|'.format('1.登陆', '2.余额'))
    print('-' * 78)
    print('|{:^36}|{:^36}|'.format('3.存钱', '4.取钱'))
    print('-' * 78)
    print('|{:^74}|'.format('5.退出'))
    print('=' * 78)

def login():
    '''
    判断登陆信息是否存在用户数据中，并临时记录在user_list中
    :return:
    '''
    # 声明user_list是全局变量，方便登陆函数添加当前登陆用户的信息给其他函数用
    global user_list
    # 等待用户输入自己的账号密码
    key_u = input('请输入用户名：')
    key_p = input('请驶入密码：')
    # 用遍历和枚举得到一个索引序列，数据下标
    for i, user_dict in enumerate(users_data):
        # 判断用户输入的信息是否存在
        if user_dict['user'] == key_u and user_dict['pw'] == key_p:
            # 当用户的信息存在后，把索引和user存到user_list列表中
            user_list.append(i)
            user_list.append(user_dict['user'])

    # 判断列表是不是为空
    if user_list != []:
        # 不为空是，代表用户输入的用户存在，则提示登陆成功
        print('{:^76}'.format('------登陆成功------\n'))
    # 否则就是没有找到用户的数据，代表密码或账户错误
    else:
        # 提示用户需不需要重新输入，输入y重新引用本函数，否则结束本函数
        if input('您输入的密码有误，是否重新输入？y/n') == 'y':
            login()


def logOut():
    '''
    登出，也是退出的函数，后期韩式可扩展成退出时保存用户操作的信息到数据库
    :return:
    '''
    print('='*78)
    print('='*30,'感谢使用，再见！！！','='*29)
    print('=' * 78)


def balance():
    '''
    查询用户的余额
    :return:
    '''
    print('=' * 78)
    # 通过登入函数中临时保存的列表中的索引，就可以找出当前用户的余额信息
    print(' '*26,'您的账户余额为{:^8}元!'.format(users_data[user_list[0]]['money']))
    print('=' * 78)


def save_money():
    '''
    存钱函数
    :return:
    '''
    # 当用户输入的不是整数，报错并返回重新调用本函数，报错时使用return组织程序继续往下运行

    key_sm = float(input('请输入您要存款的金额：'))

    # is_integer()判断一个浮点是否为整数，小数为FALSE
    if key_sm.is_integer() == False:
        print('只能输入整数！！！')
        save_money()
    else:
        # 把用户输入的整数加到用户数据中，用户数据的定位也来自登入提供的临时列表
        users_data[user_list[0]]['money'] += key_sm
        print('=' * 78)
        # 使用format占位
        print(' '* 28,'您已成功存款{:^8}元!'.format(key_sm))
        print('='* 78)


def draw_money():
    '''
    取钱
    :return:
    '''
    # 当用户输入的不是整数，报错并返回重新调用本函数，报错时使用return组织程序继续往下运行

    key_dm = float(input('请输入您要取款的金额：'))
    # 判断输入的是否为整数，整数返回True
    if key_dm.is_integer() == False:
        print('只能输入整数！！！')
        draw_money()

    # 判断余额是否大于取款金额，当账户余额充足，执行取款
    if users_data[user_list[0]]['money'] >= key_dm:
        users_data[user_list[0]]['money'] -= key_dm
        print('=' * 78)
        print(' '*28,'您已成功取款{:^8}元!'.format(key_dm))
        print('=' * 78)
    else:    #当用户余额不足是，告知，并结束本函数
        print('=' * 78)
        print('{:^78}'.format('余额不足!!!'))
        print('=' * 78)
        head()


def head():
    '''
    界面控制
    :return:
    '''
    # 使用while循环保证用户输入后能继续使用
    while True:
        # 调用界面
        show_face()
        key = input('请选择：')
        if key == '1':
            # 判断用户是否登陆，如已登陆就提醒，没登陆就执行登陆
            if user_list != []:
                print('-'*20,'您已经登陆，如要登陆新账户，请先退出！','-'*20)

            else:
                login()
        elif key == '2':
            # 判断用户是否登陆，未登陆就提醒登陆，已登陆前往余额函数
            if user_list == []:
                print('='*28,'您尚未登陆，请先登录!!!','='*28)
            else:
                balance()
                input('任意键返回!!!')
        elif key == '3':
            # 判断用户是否登陆，未登陆就提醒登陆，已登陆前往存钱函数
            if user_list == []:
                print('=' * 28, '您尚未登陆，请先登录!!!', '=' * 28)
            else:
                save_money()
                input('任意键返回!!!')
        elif key == '4':
            # 判断用户是否登陆，未登陆就提醒登陆，已登陆前往取钱函数
            if user_list == []:
                print('=' * 28, '您尚未登陆，请先登录!!!', '=' * 28)
            else:
                draw_money()
                input('任意键返回!!!')
        elif key == '5':
            # 前往登出函数
            logOut()
            break
        else:
            # 如果输入指定意外的案件，提醒有误
            print('输入有误，请重新输入！！！')



head()


